//
// Created by HP on 2025/11/5.
//

#ifndef FLIGHTSERVER_CONFIG_H
#define FLIGHTSERVER_CONFIG_H

#include <iostream>
#include <sstream>
#include <fstream>

class Config {
public:
    Config() {
        loadConfig();
        instance = this;
    }

/**
 * 加载配置文件函数
 * 从配置文件中读取并解析各种配置项，包括数据库、JWT、服务器、Redis和邮件等配置
 */
    void loadConfig() {
        // 读取配置文件，解析配置项
        // 直接读取文件
        std::ifstream file(configPath);  // 创建文件输入流对象，打开配置文件
        if (!file.is_open()) {           // 检查文件是否成功打开
            std::cerr << "Failed to open config file: " << configPath << std::endl;  // 输出错误信息
            return;  // 文件打开失败，直接返回
        }

        std::string line;        // 存储文件中读取的每一行
        std::string currentSection;  // 存储当前配置段
        while (std::getline(file, line)) {  // 从文件中逐行读取内容
            // 去除行首和行尾的空格
            line.erase(0, line.find_first_not_of(" \t"));
            line.erase(line.find_last_not_of(" \t") + 1);
            // 逐行读取文件内容
            if(line.empty() || line[0] == '#') {  // 跳过空行和注释行
                continue;
            }
            std::string key, value;  // 分别存储配置键和值
            std::istringstream iss(line);  // 创建字符串流解析当前行
            iss>>key;  // 读取键
            if(key.size()==line.size()) {  // 如果整行都是键，表示是新的配置段开始
                currentSection = key.substr(0, key.size()-1);  // 获取配置段名称
                continue;
            }

            key = key.substr(0, key.size()-1);  // 去掉键后面的冒号或等号
            iss>>value;  // 读取值

            // 根据当前配置段类型处理不同的配置项
            switch (currentSection[0]) {
                case 'd':  // 数据库配置段
                    if(key=="host") {        // 数据库主机   // 数据库端口
                        dbHost = value;
                    }
                    else if(key=="port") {   // 数据库名称
                        dbPort = value;
                    }
                    else if(key=="name") {   // 数据库用户名
                        dbName = value;
                    }
                    else if(key=="user") { // 数据库密码
                        dbUser = value;
                    }
                    else if(key=="password") { // 数据库字符集
                        dbPassword = value;
                    }
                    else if(key=="charset") {
                        dbCharset = value;  // JWT配置段
                    }                      // JWT过期时间
                    break;
                case 'j':
                    if(key=="expires_in") {       // RSA私钥路径
                        jwtExpiresIn = value;
                    }
                    else if(key=="rsa_private_key_path") {        // RSA公钥路径
                        jwtRsaPrivateKeyPath = value;
                    }
                    break;
                case 's':
                     if(key=="host") { // 服务器端口
                         serverHost = value;
                     }
                     else if(key=="port") {
                         serverPort = value;  // Redis配置段
                     }       // Redis主机
                     break;
               case 'r':
                    if(key=="host") {   // Redis端口
                        redisHost = value;
                    }
                    else if(key=="port") { // Redis密码
                        redisPort = value;
                    }
                    else if(key=="password") {      // Redis数据库编号
                        redisPassword = value;
                    }
                    else if(key=="db") {
                        redisdb = value;  // 邮件配置段
                    }      // SMTP主机
                    break;
               case 'e':
                   if(key=="smtp_host"){  // SMTP端口
                       smtp_host = value;
                   }
                   else if(key=="smtp_port"){   // 邮件用户名
                       smtp_port = value;
                   }
                   else if(key=="username"){   // 邮件密码
                       smtp_user = value;
                   }
                   else if(key=="password"){ // 发件人邮箱
                       smtp_password = value;
                   }
                   else if(key=="from_email"){
                       smtp_from = value;  // API密钥配置段
                   }           // API密钥
                   break;
               case 'A':
                   if(key=="key"){
                       apiKey = value;
                   }  // 未知配置段，跳过
                   break;
                default:
                    break;
            }
        }
    }

    void show() const{
        std::cout<<"dbHost: "<<dbHost<<std::endl;
        std::cout<<"dbPort: "<<dbPort<<std::endl;
        std::cout<<"dbName: "<<dbName<<std::endl;
        std::cout<<"dbUser: "<<dbUser<<std::endl;
        std::cout<<"dbPassword: "<<dbPassword<<std::endl;
        std::cout<<"dbCharset: "<<dbCharset<<std::endl;
        std::cout<<"jwtExpiresIn: "<<jwtExpiresIn<<std::endl;
        std::cout<<"jwtRsaPrivateKeyPath: "<<jwtRsaPrivateKeyPath<<std::endl;
        std::cout<<"serverHost: "<<serverHost<<std::endl;
        std::cout<<"serverPort: "<<serverPort<<std::endl;
        std::cout<<"redisHost: "<<redisHost<<std::endl;
        std::cout<<"redisPort: "<<redisPort<<std::endl;
        std::cout<<"redisPassword: "<<redisPassword<<std::endl;
        std::cout<<"redisdb: "<<redisdb<<std::endl;
        std::cout<<"smtp_host: "<<smtp_host<<std::endl;
        std::cout<<"smtp_port: "<<smtp_port<<std::endl;
        std::cout<<"smtp_user: "<<smtp_user<<std::endl;
        std::cout<<"smtp_password: "<<smtp_password<<std::endl;
        std::cout<<"smtp_from: "<<smtp_from<<std::endl;
        std::cout<<"apiKey: "<<apiKey<<std::endl;
    }

    static Config* instance;
    const std::string configPath = "../compose.yml";
    std::string dbHost;
    std::string dbPort;
    std::string dbName;
    std::string dbUser;
    std::string dbPassword;
    std::string dbCharset;

    std::string jwtExpiresIn;
    std::string jwtRsaPrivateKeyPath;

    std::string serverHost;
    std::string serverPort;

    std::string redisHost;
    std::string redisPort;
    std::string redisPassword;
    std::string redisdb;

    std::string smtp_host;
    std::string smtp_port;
    std::string smtp_user;
    std::string smtp_password;
    std::string smtp_from;

    std::string apiKey;
};
#endif //FLIGHTSERVER_CONFIG_H
